import axios from 'axios'
import type { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios'
import { message, Modal } from 'ant-design-vue'
import { getToken } from '@/utils/storage'
import { useAuthStore } from '@/stores/auth'

// 创建axios实例
const instance: AxiosInstance = axios.create({
  baseURL: import.meta.env.VITE_API_BASE || '/',
  timeout: 30000,
  headers: {
    'Content-Type': 'application/json;charset=utf-8'
  }
})

// 请求拦截器
instance.interceptors.request.use(
  (config) => {
    // 添加token到请求头
    const token = getToken()
    if (token && config.headers) {
      config.headers['Authorization'] = `Bearer ${token}`
    }
    return config
  },
  (error) => {
    console.error('请求错误：', error)
    return Promise.reject(error)
  }
)

// 响应拦截器
instance.interceptors.response.use(
  (response: AxiosResponse) => {
    const res = response.data

    // 判断响应状态
    if (res.code !== 200) {
      // 显示错误信息
      message.error(res.message || '系统错误')

      // 处理特定错误码
      if (res.code === 401) {
        // token失效，需要重新登录
        Modal.confirm({
          title: '提示',
          content: '您的登录状态已过期，请重新登录',
          onOk: () => {
            const authStore = useAuthStore()
            authStore.resetState()
            // 刷新页面，重定向到登录
            window.location.reload()
          }
        })
      }

      return Promise.reject(new Error(res.message || '系统错误'))
    }

    // 检查data是否为null或undefined
    if (res.data === null || res.data === undefined) {
      res.data = []
    }

    return res
  },
  (error) => {
    // 处理网络错误
    let errorMessage = '网络请求失败'
    
    // 添加调试信息
    console.error('请求错误:', error);
    
    if (error.response) {
      const status = error.response.status
      // 输出更详细的响应信息
      console.error('响应状态:', status);
      console.error('响应数据:', error.response.data);
      
      switch (status) {
        case 401:
          errorMessage = '未授权，请登录'
          // 可以在这里处理登出逻辑
          const authStore = useAuthStore()
          authStore.resetState()
          break
        case 403:
          errorMessage = '拒绝访问'
          break
        case 404:
          errorMessage = '请求的资源不存在'
          break
        case 500:
          errorMessage = '服务器错误'
          break
        default:
          errorMessage = `请求错误 (${status})`
      }
    } else if (error.request) {
      console.error('请求已发送但无响应:', error.request);
      errorMessage = '服务器无响应，请检查网络连接'
    } else if (error.code === 'ECONNABORTED') {
      errorMessage = '请求超时，请稍后重试'
    } else {
      console.error('请求配置错误:', error.message);
    }
    
    message.error(errorMessage)
    // 返回错误对象，确保带有message属性
    const enhancedError = new Error(errorMessage)
    return Promise.reject(enhancedError)
  }
)

// 封装请求方法
const request = {
  get<T = any>(url: string, config?: AxiosRequestConfig): Promise<T> {
    return instance.get(url, config)
  },
  post<T = any>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T> {
    return instance.post(url, data, config)
  },
  put<T = any>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T> {
    return instance.put(url, data, config)
  },
  delete<T = any>(url: string, config?: AxiosRequestConfig): Promise<T> {
    return instance.delete(url, config)
  },
  // 上传文件方法
  upload<T = any>(url: string, file: File, data?: object): Promise<T> {
    const formData = new FormData()
    formData.append('file', file)
    
    if (data) {
      Object.entries(data).forEach(([key, value]) => {
        formData.append(key, value as string)
      })
    }
    
    return instance.post(url, formData, {
      headers: {
        'Content-Type': 'multipart/form-data'
      }
    })
  }
}

export default request 